home *** CD-ROM | disk | FTP | other *** search
- head 1.4;
- branch ;
- access ;
- symbols ;
- locks ;
- comment @@;
-
-
- 1.4
- date 92.03.01.05.07.41; author melling; state Exp;
- branches ;
- next 1.3;
-
- 1.3
- date 92.02.28.05.18.58; author melling; state Exp;
- branches ;
- next 1.2;
-
- 1.2
- date 91.12.16.17.22.09; author melling; state Exp;
- branches ;
- next 1.1;
-
- 1.1
- date 91.12.07.03.36.59; author melling; state Exp;
- branches ;
- next ;
-
-
- desc
- @Tetris 1.1
- @
-
-
- 1.4
- log
- @*** empty log message ***
- @
- text
- @
- #import <appkit/defaults.h>
- #import <appkit/Matrix.h>
- #import <appkit/TextField.h>
- #import <appkit/TextFieldCell.h>
- #import <appkit/Window.h>
- #import <pwd.h>
- #import <strings.h>
- #import <sys/types.h>
- #import <ctype.h>
- #import "ScoreKeeper.h"
- #import "TetApp.h"
-
- #define SCORE_FILE ".TetrisScores"
-
- #define NUM_SCORES 10
- #define BEZEL_SIZE 2.0
- #define FIELD_X_OFFSET 2.0
-
- extern void setpwent();
- extern void endpwent();
- extern uid_t getuid();
- extern void chmod(char *path, int mode);
-
- @@implementation ScoreKeeper
- #ifdef FOO
- - (int) fileFoundProc(char *)path
- {
- strcpy(self->path, path);
- return 0;
- }
- #endif
-
- - (NXStream *)findScoresFile:(int) mode
- {
- NXStream *result;
- char *appName;
-
- strcpy(path, NXArgv[0]);
- if ((appName = rindex(path, '/')))
- appName++;
- else
- appName = path;
- strcpy(appName, SCORE_FILE);
- if (!(result = NXMapFile(path, mode))) {
- strcat(strcat(strcpy(path, NXHomeDirectory()), "/"), SCORE_FILE);
- result = (mode == NX_READONLY) ? NXMapFile(path, NX_READONLY) :
- NXOpenMemory(NULL, 0, mode);
- }
- return result;
- }
-
- - init
- {
- [super init];
- nameField = nil;
- return self;
- }
-
- - (void) readHighScores:(NXStream *)stream
- {
- int c;
- char name[BUFSIZ];
- char level[5];
- char myScore[10];
-
- for (c = 0; c < NUM_SCORES; c++) {
- name[0] = level[0] = myScore[0] = '\0';
- NXScanf(stream, "%[^\7]\7%[^\7]\7%[^\7]\7", name, level, myScore);
- [[names cellAt:c :0] setStringValue:name],
- [[levels cellAt:c :0] setStringValue:level],
- [[scores cellAt:c :0] setStringValue:myScore];
- }
- }
-
- - setScoresWindow:anObject
- {
- NXStream *inStream;
-
- scoresWindow = anObject;
- [scoresWindow setDelegate:self];
- if ((inStream = [self findScoresFile: NX_READONLY])) {
- [self readHighScores: inStream];
- NXCloseMemory(inStream, NX_FREEBUFFER);
- }
- return self;
- }
-
- - setZero
- {
- [score setIntValue:0];
- return self;
- }
-
- - addScore:(int)amount
- {
- [score setIntValue:[score intValue] + amount];
- return self;
- }
-
- static char *username()
- {
- static char *username = (char *)0;
- struct passwd *pwdentry;
- static char ubuf [128];
-
- if (!username) {
- char * pc;
-
- setpwent();
- pwdentry = getpwuid(getuid());
- endpwent();
- username = ((pwdentry) ? pwdentry->pw_gecos : "");
- /* extended GECOS field handling added by Detlev Droege,
- * droege@@infko.uni-koblenz.de, December 1991 */
- if (pc = index (username, ','))
- *pc = 0; /* strip ','-part of gecos field */
- if (index (username, '&')) {
- /* do '&' expansion */
- pc = ubuf;
- while (*username) {
- if (*username == '&') {
- strcpy (pc, pwdentry->pw_name);
- *pc = toupper (*pc);
- while (*pc) pc++;
- }
- else
- *pc++ = *username;
- username++;
- }
- *pc = 0;
- username = ubuf;
- }
- }
- return username;
- }
-
- - (int) findrank:(int) myScore
- {
- id window = [names window];
- int myRank;
- int c;
-
- [window disableFlushWindow];
- for (myRank = 0; myRank < NUM_SCORES; myRank++)
- if (myScore >= [[scores cellAt:myRank :0] intValue])
- break;
- for (c = NUM_SCORES - 1; c > myRank; c--) {
- [[names cellAt:c :0] setStringValue:
- [[names cellAt:(c - 1) :0] stringValue]];
-
- [[levels cellAt:c :0] setStringValue:
- [[levels cellAt:(c - 1) :0] stringValue]];
-
- [[scores cellAt:c :0] setStringValue:
- [[scores cellAt:(c - 1) :0] stringValue]];
- }
- [window reenableFlushWindow];
- return myRank;
- }
-
- - updateHighScores:(int)level
- {
- id window = [names window];
- int scoreValue = [score intValue];
- NXRect nRect;
-
- if ((rank = [self findrank: scoreValue]) < NUM_SCORES) {
- [scoresWindow makeKeyAndOrderFront:self];
- [[levels cellAt:rank :0] setIntValue:level];
- [[scores cellAt:rank :0] setIntValue:scoreValue];
- [[names getCellFrame:&nRect at:rank :0] convertRect:&nRect toView:nil];
- NXInsetRect(&nRect, -BEZEL_SIZE, -BEZEL_SIZE);
- nRect.origin.x -= FIELD_X_OFFSET;
-
- if (!nameField) {
- nameField = [[TextField alloc] initFrame:&nRect];
- [nameField setEditable:YES];
- [[nameField setTarget:self] setAction:@@selector(nameFieldEnd:)];
- } else
- [nameField moveTo:nRect.origin.x :nRect.origin.y];
-
- [nameField setStringValue:username()];
- [[window contentView] addSubview:nameField];
- [[nameField display] selectText:self];
- while ([NXApp peekAndGetNextEvent:NX_KEYUPMASK | NX_KEYDOWNMASK]) ;
- [NXApp runModalFor:window];
- }
- return self;
- }
-
- - nameFieldEnd:sender
- {
- id window = [names window];
-
- [window disableFlushWindow];
- [[names cellAt:rank :0] setStringValue:[nameField stringValue]];
- [nameField removeFromSuperview];
- [window display];
- [[window reenableFlushWindow] flushWindow];
- [NXApp stopModal];
- return self;
- }
-
- - windowWillClose:sender
- {
- if (nameField && [nameField currentEditor]) {
- [self nameFieldEnd:sender];
- return nil;
- } else
- return self;
- }
-
- - writeHighScores:(NXStream *)stream
- {
- int c;
-
- for (c = 0; c < NUM_SCORES; c++)
- NXPrintf(stream, "%s\7%s\7%s\7",
- [[names cellAt:c :0] stringValue],
- [[levels cellAt:c :0] stringValue],
- [[scores cellAt:c :0] stringValue]);
- NXFlush(stream);
- return self;
- }
-
- - writeScores
- {
- NXStream *outStream;
-
- if ((outStream = [self findScoresFile: NX_WRITEONLY])) {
- [self writeHighScores: outStream];
- NXSaveToFile(outStream, path);
- NXCloseMemory(outStream, NX_FREEBUFFER);
- chmod(path, 0666);
- }
- return self;
- }
-
- - free
- {
- if (nameField)
- [nameField free];
- return [super free];
- }
-
- @@end
-
- @
-
-
- 1.3
- log
- @*** empty log message ***
- @
- text
- @d10 1
- d78 1
- a78 1
- NXStream *inStream;
- d80 7
- a86 7
- scoresWindow = anObject;
- [scoresWindow setDelegate:self];
- if ((inStream = [self findScoresFile: NX_READONLY])) {
- [self readHighScores: inStream];
- NXCloseMemory(inStream, NX_FREEBUFFER);
- }
- return self;
- d91 2
- a92 2
- [score setIntValue:0];
- return self;
- d105 1
- d108 2
- d114 20
- @
-
-
- 1.2
- log
- @*** empty log message ***
- @
- text
- @d64 1
- a64 1
- char score[10];
- d67 2
- a68 2
- name[0] = level[0] = score[0] = '\0';
- NXScanf(stream, "%[^\7]\7%[^\7]\7%[^\7]\7", name, level, score);
- d71 1
- a71 1
- [[scores cellAt:c :0] setStringValue:score];
- d114 1
- a114 1
- - (int) findrank:(int) score
- d117 1
- a117 1
- int rank;
- d119 1
- a119 1
-
- d121 2
- a122 2
- for (rank = 0; rank < NUM_SCORES; rank++)
- if (score >= [[scores cellAt:rank :0] intValue])
- d124 1
- a124 1
- for (c = NUM_SCORES - 1; c > rank; c--) {
- d135 1
- a135 1
- return rank;
- @
-
-
- 1.1
- log
- @Initial revision
- @
- text
- @d25 2
- a26 2
-
- static int fileFoundProc(char *path, id self)
- d31 1
- d33 1
- a33 1
- static NXStream *findScoresFile(id self, int mode)
- d35 12
- a46 12
- NXStream *result;
- char *appName;
-
- strcpy(self->path, NXArgv[0]);
- if ((appName = rindex(self->path, '/')))
- appName++;
- else
- appName = self->path;
- strcpy(appName, SCORE_FILE);
- if (!(result = NXMapFile(self->path, mode))) {
- strcat(strcat(strcpy(self->path, NXHomeDirectory()), "/"), SCORE_FILE);
- result = (mode == NX_READONLY) ? NXMapFile(self->path, NX_READONLY) :
- d48 2
- a49 2
- }
- return result;
- d59 1
- a59 1
- static void readHighScores(id self, NXStream *stream)
- d69 3
- a71 3
- [[self->names cellAt:c :0] setStringValue:name],
- [[self->levels cellAt:c :0] setStringValue:level],
- [[self->scores cellAt:c :0] setStringValue:score];
- d81 2
- a82 2
- if ((inStream = findScoresFile(self, NX_READONLY))) {
- readHighScores(self, inStream);
- d114 1
- a114 1
- static int findrank(id self, int score)
- d116 1
- a116 1
- id window = [self->names window];
- d122 1
- a122 1
- if (score >= [[self->scores cellAt:rank :0] intValue])
- d125 8
- a132 6
- [[self->names cellAt:c :0] setStringValue:
- [[self->names cellAt:(c - 1) :0] stringValue]];
- [[self->levels cellAt:c :0] setStringValue:
- [[self->levels cellAt:(c - 1) :0] stringValue]];
- [[self->scores cellAt:c :0] setStringValue:
- [[self->scores cellAt:(c - 1) :0] stringValue]];
- d144 1
- a144 1
- if ((rank = findrank(self, scoreValue)) < NUM_SCORES) {
- d190 1
- a190 1
- writeHighScores(id self, NXStream *stream)
- d196 3
- a198 3
- [[self->names cellAt:c :0] stringValue],
- [[self->levels cellAt:c :0] stringValue],
- [[self->scores cellAt:c :0] stringValue]);
- d200 1
- d206 3
- a208 3
-
- if ((outStream = findScoresFile(self, NX_WRITEONLY))) {
- writeHighScores(self, outStream);
- @
-